Background


Data Collection

Data Configuration

We have species composition data from 1031 1m^2 quadrats representing 27 sites.

Nearly all statistical packages require the data to be in a presence-absence form. There are several ways to do it (one of which can maintain cover values rather than changing it to binary data); I used a loop function. The result is a presence-absence matrix with Site as a column so subsamples can be organized accordingly. This column must be deleted for every analysis, however!

Table 1. Sample of data in presence-absence format.
Site SCICYP PROPEC JUNDEB JUNREP CXJOOR CXLOUI
1.1.1 1 1 1 1 1 1 0
1.1.2 1 1 1 1 0 0 1
1.1.3 1 1 1 0 0 0 1
1.1.4 1 1 1 0 0 1 1
1.1.5 1 0 0 0 0 0 1

Diversity Estimates

Sites had widely varying observed total richness. The use of extrapolated species accumulation curves can tell us how many species are likely to be at the site based on how many were found in accumulating subsamples. However if a curve never flattens, it gives a wild estimate of richness (see Site 10).

What do the curves that made these estimates look like? Let’s take a look!

This plot is not particularly helpful other than to visualize the general span of observed and expected richnesses and sampling efforts. Examining the curves in portions of 3-4 is necessary to

These curves illustrate not only where the flattening point (expected richness) occurs, but also how quickly. Examining a curve can allow someone to estimate how many more samples would be needed to reach that point, however if doing so samples a larger area then the curve may never flatten.

Let’s see if sampling effort (# quadrats/area sampled) affected percent estimated sampling completion; if it did, that would be a big problem and I would have a lot of explaining to do to my committee.

There is no relationship between sampling effort and completion percentage (p=0.6366006). However, note that Sites 10 and 26 were flagged as outliers by the autoplot function. This inadequate sampling is likely the result of too few quadrats sampled at the wetland edge relative to the size of the wetland.

Effects on Diversity


There appears to be a relationship between site richness and site area, but unexpectedly this relationship appears to be negative. Because the data are likely non-linear, a generalized linear model should be used to assess this relationship.

Community Classification

Similarity matrix

Ordinations

LS0tDQp0aXRsZTogIkRldGVybWluaXN0aWMgcHJvY2Vzc2VzIGRyaXZlIHdldGxhbmQgcGxhbnQgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGFuZCBkaXZlcnNpdHkgaW4gdGhlIEVhc3Rlcm4gSGlnaGxhbmQgUmltIg0KYXV0aG9yOiAiQy4gTS4gQ2lhZnJlIg0Kb3V0cHV0Og0KICBodG1sX25vdGVib29rOg0KICAgIGRmX3ByaW50OiBwYWdlZA0KICAgIHJvd3MucHJpbnQ6IDEwDQogICAgdGhlbWU6IGpvdXJuYWwNCiAgICBoaWdobGlnaHQ6IHplbmJ1cm4NCiAgICBudW1iZXJfc2VjdGlvbnM6IG5vDQoNCi0tLQ0KIyAgIHsudGFic2V0IC50YWJzZXQtZmFkZX0NCg0KYGBge3Igc2V0dXAsIE5PVElDRSBVU0Ugb2YgUEFDTUFOLCBpbmNsdWRlPUZBTFNFfQ0KI2luc3RhbGwgcGFjbWFuIGZpcnN0IHRvIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCBhbmQgbG9hZCBhbnkgbmVlZGVkIHBhY2thZ2VzDQpwYWNtYW46OnBfbG9hZChnZ3Bsb3QyLCBkcGx5ciwgdGlkeXIsIHJlc2hhcGUsIGlORVhULCBrbml0ciwga2FibGVFeHRyYSwgZ2dmb3J0aWZ5LCBnZ3B1YnIsIHZlZ2FuKQ0KDQojTm90IHN1cmUgd2h5IEkga2VlcCB0aGlzIGluDQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpDQoNCiNMb2FkIGRhdGENCnNwcHhzaXRlczwtcmVhZC5jc3YoImRhdGEvVkVHREFUQURPTkUuY3N2IiwgaGVhZGVyPVRSVUUpDQpzaXRlbmFtZXM8LXJlYWQuY3N2KCJkYXRhL1NpdGVOYW1lcy5jc3YiLCBoZWFkZXI9VFJVRSkNCnNpdGVzaXplczwtcmVhZC5jc3YoImRhdGEvU2l0ZVhzaXplMi5jc3YiLCBoZWFkZXI9VFJVRSkNCnF1YWRkYXRhczwtcmVhZC5jc3YoImRhdGEvcXVhZG1ldHJpY3MuY3N2IiwgaGVhZGVyPVRSVUUpDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJEZXB0aC4ubS4iXSA8LSAiRGVwdGgiDQpjb2xuYW1lcyhxdWFkZGF0YXMpW2NvbG5hbWVzKHF1YWRkYXRhcyk9PSJYLi5DYW5vcHkiXSA8LSAiQ2Fub3B5Ig0KY29sbmFtZXMocXVhZGRhdGFzKVtjb2xuYW1lcyhxdWFkZGF0YXMpPT0iUG9uZCJdIDwtICJTaXRlIg0KI05vdGU6IHRoZXJlIGlzIG5vIFNpdGUgMTU7IGl0IHdhcyBkaXRjaGVkIGhhbGZ3YXkgdGhyb3VnaCBzYW1wbGluZyBiZWNhdXNlIGl0IHdhcyBub3QgaW5kZXBlbmRlbnQgZnJvbSBTaXRlIDE0Lg0KYGBgDQoNCiMjIEJhY2tncm91bmQgDQoNCjxmaWd1cmU+DQo8aW1nIHNyYz0iSW1hZ2VzL1F1YWRyYXRDcm9wcGVkLmpwZyI+PC9maWd1cmU+PGJyPg0KDQojIyMgRGF0YSBDb2xsZWN0aW9uDQoNCiMjIyBEYXRhIENvbmZpZ3VyYXRpb24NCg0KV2UgaGF2ZSBzcGVjaWVzIGNvbXBvc2l0aW9uIGRhdGEgZnJvbSAxMDMxIDFtXjIgcXVhZHJhdHMgcmVwcmVzZW50aW5nIDI3IHNpdGVzLg0KDQpOZWFybHkgYWxsIHN0YXRpc3RpY2FsIHBhY2thZ2VzIHJlcXVpcmUgdGhlIGRhdGEgdG8gYmUgaW4gYSBwcmVzZW5jZS1hYnNlbmNlIGZvcm0uIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gZG8gaXQgKG9uZSBvZiB3aGljaCBjYW4gbWFpbnRhaW4gY292ZXIgdmFsdWVzIHJhdGhlciB0aGFuIGNoYW5naW5nIGl0IHRvIGJpbmFyeSBkYXRhKTsgSSB1c2VkIGEgbG9vcCBmdW5jdGlvbi4gVGhlIHJlc3VsdCBpcyBhIHByZXNlbmNlLWFic2VuY2UgbWF0cml4IHdpdGggU2l0ZSBhcyBhIGNvbHVtbiBzbyBzdWJzYW1wbGVzIGNhbiBiZSBvcmdhbml6ZWQgYWNjb3JkaW5nbHkuIFRoaXMgY29sdW1uIG11c3QgYmUgZGVsZXRlZCBmb3IgZXZlcnkgYW5hbHlzaXMsIGhvd2V2ZXIhDQoNCmBgYHtyIExvb3AgbWFnaWMsIGNhY2hlPVRSVUUsIGluY2x1ZGU9RkFMU0V9DQpzaXRlc19zdWI8LXVuaXF1ZShzcHB4c2l0ZXMkSUQpDQpzcHBfc3ViPC11bmlxdWUoc3BweHNpdGVzJFNwZWNpZXMpDQoNCiNNYWtlIGEgbWF0cml4IHdpdGggbG9vcCBmdW5jdGlvbg0Kc3BwX2NvbW1hdCA8LSBtYXRyaXgoMCwgbGVuZ3RoKHNpdGVzX3N1YiksIGxlbmd0aChzcHBfc3ViKSkNCmZvciAoaSBpbiAxOm5yb3coc3BwX2NvbW1hdCkpe3RlbXBfc2l0ZXMgPC0gc3BweHNpdGVzW3doaWNoKHNwcHhzaXRlcyRJRCA9PSBzaXRlc19zdWJbaV0pLF0NCiAgc3BwX2NvbW1hdFtpLCB3aGljaChzcHBfc3ViJWluJXRlbXBfc2l0ZXMkU3BlY2llcyldPC0gMQ0KICBwcmludChpKX0NCg0KI05hbWUgcm93cyBhbmQgQ29sdW1ucw0Kcm93bmFtZXMoc3BwX2NvbW1hdCkgPC0gYXMuY2hhcmFjdGVyKHNpdGVzX3N1YikNCmNvbG5hbWVzKHNwcF9jb21tYXQpIDwtIGFzLmNoYXJhY3RlcihzcHBfc3ViKQ0KDQojQ2hhbmdlIG1hdHJpeCBpbnRvIGRhdGFmcmFtZQ0Kc3BwX2NvbW1hdC5kZjwtIGFzLmRhdGEuZnJhbWUoc3BwX2NvbW1hdCkNCg0KI01ha2UgZW1wdHkgcXVhZHJhdHMgdHJ1bHkgZW1wdHkNCnNwcF9jb21tYXQuZGYuZml4ZWQ8LXN1YnNldChzcHBfY29tbWF0LmRmLCBzZWxlY3Q9LWMoRW1wdHkpKQ0KDQojQWRkIHNpdGUgY29sdW1uIGJhY2sgaW4gYW5kIGNoYW5nZSBpdHMgbmFtZQ0KQWxsUG9uZHMgPC0gY2JpbmQoc2l0ZW5hbWVzJFBvbmQsc3BwX2NvbW1hdC5kZi5maXhlZCkNCm5hbWVzKEFsbFBvbmRzKVtuYW1lcyhBbGxQb25kcyk9PSJzaXRlbmFtZXMkUG9uZCJdIDwtICJTaXRlIg0KYGBgDQoNCmBgYHtyIEthYmxlIDEsIGVjaG89RkFMU0V9DQpBbGxQb25kc1RyaW1tZWQ8LXNlbGVjdChBbGxQb25kcywgYygxOjcpKQ0Ka2FibGUoQWxsUG9uZHNUcmltbWVkWzE6NSwgXSwgZm9ybWF0ID0gInBhbmRvYyIsIGZ1bGxfd2lkdGg9RiwgY2FwdGlvbiA9ICdUYWJsZSAxLiBTYW1wbGUgb2YgZGF0YSBpbiBwcmVzZW5jZS1hYnNlbmNlIGZvcm1hdC4nKQ0KYGBgDQoNCg0KIyMgRGl2ZXJzaXR5IEVzdGltYXRlcw0KDQpgYGB7ciBTcGxpdCBzaXRlcywgaW5jbHVkZT1GQUxTRX0NCiNCcmVhayB1cCBBbGxQb25kcyBpbnRvIGRhdGFmcmFtZXMgYnkgc2l0ZQ0KI1RoZSBmaXJzdCBjb2x1bW4gaGFzIHRvIGJlIHJlbW92ZWQgZm9yIGVhY2gNCiNUcmFuc3Bvc2UgdGhlIGRhdGFmcmFtZXMgc28gc3BlY2llcyBhcmUgY29sdW1ucw0KDQpTMDE8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxKSwgLTEpKQ0KUzAyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMiksIC0xKSkNClMwMzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDMpLCAtMSkpDQpTMDQ8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA0KSwgLTEpKQ0KUzA1PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gNSksIC0xKSkNClMwNjwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDYpLCAtMSkpDQpTMDc8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSA3KSwgLTEpKQ0KUzA4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gOCksIC0xKSkNClMwOTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDkpLCAtMSkpDQpTMTA8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMCksIC0xKSkNClMxMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDExKSwgLTEpKQ0KUzEyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTIpLCAtMSkpDQpTMTM8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxMyksIC0xKSkNClMxNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE0KSwgLTEpKQ0KUzE2PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTYpLCAtMSkpDQpTMTc8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAxNyksIC0xKSkNClMxODwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDE4KSwgLTEpKQ0KUzE5PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMTkpLCAtMSkpDQpTMjA8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMCksIC0xKSkNClMyMTwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDIxKSwgLTEpKQ0KUzIyPC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjIpLCAtMSkpDQpTMjM8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyMyksIC0xKSkNClMyNDwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI0KSwgLTEpKQ0KUzI1PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjUpLCAtMSkpDQpTMjY8LXQoc2VsZWN0KGZpbHRlcihBbGxQb25kcywgU2l0ZSA9PSAyNiksIC0xKSkNClMyNzwtdChzZWxlY3QoZmlsdGVyKEFsbFBvbmRzLCBTaXRlID09IDI3KSwgLTEpKQ0KUzI4PC10KHNlbGVjdChmaWx0ZXIoQWxsUG9uZHMsIFNpdGUgPT0gMjgpLCAtMSkpDQpgYGANCg0KYGBge3IgVW5pY29ybiB2b21pdCBwcmVwLCBmaWcuaGVpZ2h0PTYsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgY2FjaGU9VFJVRSwgaW5jbHVkZT1GQUxTRX0NCiNNYWtlIGEgbGlzdCBvZiBhbGwgc2l0ZSBkYXRhZnJhbWVzDQpzaXRlLmxpc3QuYWxsID0gbGlzdChTMDE9UzAxLFMwMj1TMDIsUzAzPVMwMyxTMDQ9UzA0LFMwNT1TMDUsUzA2PVMwNixTMDc9UzA3LFMwOD1TMDgsUzA5PVMwOSxTMTA9UzEwLFMxMT1TMTEsUzEyPVMxMixTMTM9UzEzLFMxND1TMTQsUzE2PVMxNixTMTc9UzE3LFMxOD1TMTgsUzE5PVMxOSxTMjA9UzIwLFMyMT1TMjEsUzIyPVMyMixTMjM9UzIzLFMyND1TMjQsUzI1PVMyNSxTMjY9UzI2LFMyNz1TMjcsUzI4PVMyOCkNCiNDb252ZXJ0IGV2ZXJ5dGhpbmcgaW4gbGlzdCB0byBpbmNpZGVuY2UgZnJlcXVlbmNpZXMNCnNpdGUubGlzdC5mcmVxLmFsbCA9IGxhcHBseShzaXRlLmxpc3QuYWxsLCBhcy5pbmNmcmVxKQ0KYGBgDQoNCmBgYHtyIFVuaWNvcm4gdm9taXQgcHJlcDIsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFLCBpbmNsdWRlPUZBTFNFfQ0Kb3V0LmluYy5hbGw8LWlORVhUKHNpdGUubGlzdC5mcmVxLmFsbCwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBuYm9vdD0xMDAwMCkNCmBgYA0KDQpgYGB7ciBLYWJsZSAyLCBpbmNsdWRlPUZBTFNFfQ0KI1RoZSBpTkVYVCBvdXRwdXQgKCJvdXQuaW5jLmFsbCIpIGNvbnRhaW5zIHRocmVlIHRhYmxlczsgIkFzeUVzdCIgaGFzIGFsbCB0aGUgZGF0YSB3ZSBuZWVkDQojU2F2ZWQgaXQgYXMgYW4gb2JqZWN0IGFuZCBjaGFuZ2VkIGl0IHNvIGl0IHdvdWxkIGJlIG1vcmUgcmVhZGFibGUNClJpY2hEaXY8LW91dC5pbmMuYWxsJEFzeUVzdA0KUmljaERpdlQ8LXN1YnNldChSaWNoRGl2LCBzZWxlY3Q9LWMocy5lLiwgTENMLCBVQ0wpKQ0KUmljaERpdk9iczwtc3Vic2V0KHNwcmVhZChSaWNoRGl2VCwgRGl2ZXJzaXR5LCBPYnNlcnZlZCksIHNlbGVjdD0tYyhFc3RpbWF0b3IpKQ0KUmljaERpdkVzdDwtc3Vic2V0KHNwcmVhZChSaWNoRGl2VCwgRGl2ZXJzaXR5LCBFc3RpbWF0b3IpLCBzZWxlY3Q9LWMoT2JzZXJ2ZWQpKQ0KDQojVHJpbSBkb3duIGNvbHVtbiBuYW1lcyBzbyB0aGV5IGRvbid0IHN1Y2sNCm5hbWVzKFJpY2hEaXZPYnMpPC1jKCJTaXRlIiwgIlJpY2huZXNzT2JzIiwgIlNoYW5ub25PYnMiLCAiU2ltcHNvbk9icyIpDQpuYW1lcyhSaWNoRGl2RXN0KTwtYygiU2l0ZSIsICJSaWNobmVzc0V4cCIsICJTaGFubm9uRXhwIiwgIlNpbXBzb25FeHAiKQ0KDQojQ29sbGFwc2Ugc2l0ZXM7IGhhdmUgdG8gZG8gZnVua3kgdGhpbmdzIHRvIGRlYWwgd2l0aCBOQXMNCmNvbXByZXNzIDwtIGZ1bmN0aW9uKHgpIGMobmEub21pdCh4KSwgTkEpWzFdDQpSaWNoRGl2T2JzLjE8LWFnZ3JlZ2F0ZShSaWNoRGl2T2JzWzI6NF0sIFJpY2hEaXZPYnNbMV0sIGNvbXByZXNzKQ0KUmljaERpdkVzdC4xPC1hZ2dyZWdhdGUoUmljaERpdkVzdFsyOjRdLCBSaWNoRGl2RXN0WzFdLCBjb21wcmVzcykNCg0KI1JlbW92ZSBzaXRlIGNvbHVtbiBmcm9tIFJpY2hEaXZFc3Qgc28gaXQncyBub3QgZHVwbGljYXRlZCB3aGVuIG1lcmdpbmcNClJpY2hEaXZFc3QuMjwtc3Vic2V0KFJpY2hEaXZFc3QuMSwgc2VsZWN0PS1jKFNpdGUpKQ0KDQojTWVyZ2UgZXZlcnlib2R5IHRvZ2V0aGVyDQpSaWNoRGl2RmluYWw8LWNiaW5kKFJpY2hEaXZPYnMuMSwgUmljaERpdkVzdC4yKQ0KDQojUmVvcmRlciBjb2x1bW5zIHNvIHRoZXkgbWFrZSBzZW5zZQ0KUmljaERpdlRhYjwtUmljaERpdkZpbmFsWyxjKDEsMiw1LDMsNiw0LDcpXQ0KUmljaERpdkthYjwtUmljaERpdlRhYltjKDEsIDYsIDcsIDgsIDEwLCAyNiwgMjcpLF0NCg0Ka2FibGUoUmljaERpdkthYlsxOjcsXSwgZm9ybWF0ID0gInBhbmRvYyIsIGZ1bGxfd2lkdGg9RiwgY2FwdGlvbiA9ICdUYWJsZSAyLiBPYnNlcnZlZCBhbmQgZXhwZWN0ZWQgSGlsbCBudW1iZXJzIGZyb20gYSBwb3J0aW9uIG9mIHRoZSBzaXRlcy4nKQ0KYGBgDQoNCmBgYHtyIEVzdCBhbmQgT2JzIFJpY2huZXNzLCBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTQsIGZpZy53aWR0aD0xMCwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NClJpY2huZXNzT25seTwtZmlsdGVyKFJpY2hEaXYsIERpdmVyc2l0eSA9PSAiU3BlY2llcyByaWNobmVzcyIpDQpjb2xuYW1lcyhSaWNobmVzc09ubHkpW2NvbG5hbWVzKFJpY2huZXNzT25seSk9PSJMQ0wiXSA8LSAiUmljaExDTCINCmNvbG5hbWVzKFJpY2huZXNzT25seSlbY29sbmFtZXMoUmljaG5lc3NPbmx5KT09IlVDTCJdIDwtICJSaWNoVUNMIg0KY29sbmFtZXMoUmljaG5lc3NPbmx5KVtjb2xuYW1lcyhSaWNobmVzc09ubHkpPT0iRXN0aW1hdG9yIl0gPC0gIkVzdGltYXRlZCINClJpY2hHYXRoPC1nYXRoZXIoUmljaG5lc3NPbmx5LFJpY2huZXNzLHZhbHVlLE9ic2VydmVkOkVzdGltYXRlZCkNClJpY2hTaXplPC0gY2JpbmQoUmljaEdhdGgsIHNpdGVzaXplcyRRdWFkcmF0cykNCmNvbG5hbWVzKFJpY2hTaXplKVtjb2xuYW1lcyhSaWNoU2l6ZSk9PSJzaXRlc2l6ZXMkUXVhZHJhdHMiXSA8LSAiUXVhZHJhdHMiDQoNCg0KZ2dwbG90KFJpY2hHYXRoLCBhZXMoeD1TaXRlLCB5PXZhbHVlLCBjb2xvcj1SaWNobmVzcykpICsNCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCJkYXJrZ3JleSIsICJibGFjayIpKSsNCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1SaWNoTENMLCB5bWF4PVJpY2hVQ0wpLCB3aWR0aD0uMywgY29sb3I9ImRhcmtncmV5IikgKw0KICBnZW9tX3BvaW50KHNpemU9MikrDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSsNCiAgY29vcmRfY2FydGVzaWFuKHlsaW0gPSBjKDAsIDI1MCkpKw0KICBnZ3RpdGxlKCJFc3RpbWF0ZWQgYW5kIG9ic2VydmVkIHNwZWNpZXMgcmljaG5lc3MgYnkgc2l0ZSwgd2l0aCA5NSUgY29uZmlkZW5jZSBpbnRlcnZhbHMuIikrDQogIGxhYnMoY2FwdGlvbj0iTm90ZSB0aGF0IHVwcGVyIGNvbmZpZGVuY2UgaW50ZXJ2YWwgZm9yIFNpdGUgMjYgZXh0ZW5kcyB0byAyNjIuOCBhbmQgU2l0ZSAxMCBleHRlbmRzIHRvIDQwOC41Mi4iKSsNCiAgdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZT0xNCksIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoc2l6ZT0xNCkpDQpgYGANCg0KU2l0ZXMgaGFkIHdpZGVseSB2YXJ5aW5nIG9ic2VydmVkIHRvdGFsIHJpY2huZXNzLiBUaGUgdXNlIG9mIGV4dHJhcG9sYXRlZCBzcGVjaWVzIGFjY3VtdWxhdGlvbiBjdXJ2ZXMgY2FuIHRlbGwgdXMgaG93IG1hbnkgc3BlY2llcyBhcmUgbGlrZWx5IHRvIGJlIGF0IHRoZSBzaXRlIGJhc2VkIG9uIGhvdyBtYW55IHdlcmUgZm91bmQgaW4gYWNjdW11bGF0aW5nIHN1YnNhbXBsZXMuIEhvd2V2ZXIgaWYgYSBjdXJ2ZSBuZXZlciBmbGF0dGVucywgaXQgZ2l2ZXMgYSB3aWxkIGVzdGltYXRlIG9mIHJpY2huZXNzIChzZWUgU2l0ZSAxMCkuDQoNCldoYXQgZG8gdGhlIGN1cnZlcyB0aGF0IG1hZGUgdGhlc2UgZXN0aW1hdGVzIGxvb2sgbGlrZT8gTGV0J3MgdGFrZSBhIGxvb2shDQoNCmBgYHtyIFVuaWNvcm4gdm9taXQsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NiwgZmlnLndpZHRoPTEwLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBjYWNoZT1UUlVFfQ0KZ2dpTkVYVChvdXQuaW5jLmFsbCwgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGdndGl0bGUoIkludGVycG9sYXRlZCBhbmQgZXh0cmFwb2xhdGVkIHJpY2huZXNzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwMDAuIikNCmBgYA0KDQpUaGlzIHBsb3QgaXMgbm90IHBhcnRpY3VsYXJseSBoZWxwZnVsIG90aGVyIHRoYW4gdG8gdmlzdWFsaXplIHRoZSBnZW5lcmFsIHNwYW4gb2Ygb2JzZXJ2ZWQgYW5kIGV4cGVjdGVkIHJpY2huZXNzZXMgYW5kIHNhbXBsaW5nIGVmZm9ydHMuIEV4YW1pbmluZyB0aGUgY3VydmVzIGluIHBvcnRpb25zIG9mIDMtNCBpcyBuZWNlc3NhcnkgdG8gDQoNCmBgYHtyIFNtYWxsZXIgY3VydmVzIDEsIGluY2x1ZGU9RkFMU0V9DQojTGlzdCB0aGUgZGF0YWZyYW1lcywgdGhlbiBjb252ZXJ0IHRoZW0gaW50byBpbmNpZGVuY2UgZnJlcXVlbmNpZXMNCiNJIGJyb2tlIHRoZW0gaW50byBtYW5hZ2VhYmxlIGNodW5rcyB0aGF0IGdyYXBoIG1vcmUgY2xlYXJseSB0aGFuIGV2ZXJ5dGhpbmcgYXQgb25jZQ0KDQpzaXRlLmxpc3QuMSA9IGxpc3QoUzAzPVMwMywgUzA4PVMwOCwgIFMwOT1TMDksIFMyOD1TMjgpDQpzaXRlLmxpc3QuZnJlcS4xID0gbGFwcGx5KHNpdGUubGlzdC4xLCBhcy5pbmNmcmVxKQ0KDQpzaXRlLmxpc3QuMiA9IGxpc3QoUzAxPVMwMSwgUzAyPVMwMiwgIFMxMT1TMTEsIFMyNz1TMjcpDQpzaXRlLmxpc3QuZnJlcS4yID0gbGFwcGx5KHNpdGUubGlzdC4yLCBhcy5pbmNmcmVxKQ0KDQpzaXRlLmxpc3QuMyA9IGxpc3QoUzEwPVMxMCwgUzEzPVMxMywgUzE0PVMxNCwgUzIzPVMyMykNCnNpdGUubGlzdC5mcmVxLjMgPSBsYXBwbHkoc2l0ZS5saXN0LjMsIGFzLmluY2ZyZXEpDQoNCg0Kc2l0ZS5saXN0LjQgPSBsaXN0KFMwNT1TMDUsUzEyPVMxMiwgUzE3PVMxNykNCnNpdGUubGlzdC5mcmVxLjQgPSBsYXBwbHkoc2l0ZS5saXN0LjQsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC41ID0gbGlzdCggUzE5PVMxOSwgUzIwPVMyMCwgUzIxPVMyMSwgUzI1PVMyNSkNCnNpdGUubGlzdC5mcmVxLjUgPSBsYXBwbHkoc2l0ZS5saXN0LjUsIGFzLmluY2ZyZXEpDQoNCnNpdGUubGlzdC42ID0gbGlzdChTMDY9UzA2LCBTMTY9UzE2LCBTMjI9UzIyLCBTMjY9UzI2KQ0Kc2l0ZS5saXN0LmZyZXEuNiA9IGxhcHBseShzaXRlLmxpc3QuNiwgYXMuaW5jZnJlcSkNCg0Kc2l0ZS5saXN0LjcgPSBsaXN0KFMwND1TMDQsIFMwNz1TMDcsIFMxOD1TMTgsIFMyND1TMjQpDQpzaXRlLmxpc3QuZnJlcS43ID0gbGFwcGx5KHNpdGUubGlzdC43LCBhcy5pbmNmcmVxKQ0KYGBgDQoNCmBgYHtyIFNtYWxsZXIgY3VydmVzIDIsIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9NCwgZmlnLndpZHRoPTcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGNhY2hlPVRSVUV9DQojUmljaG5lc3MgKHE9MCksIFNoYW5ub24gRGl2IChxPTEpLCBTaW1wc29uIERpdiAocT0yKQ0KI1VzZSBncmV5PVRSVUUgdG8gbWFrZSBhbGwgbGluZXMgYmxhY2sNCm91dC5pbmMxPC1pTkVYVChzaXRlLmxpc3QuZnJlcS4xLCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KQTwtZ2dpTkVYVChvdXQuaW5jMSwgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzI8LWlORVhUKHNpdGUubGlzdC5mcmVxLjIsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpCPC1nZ2lORVhUKG91dC5pbmMyLCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jMzwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuMywgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkM8LWdnaU5FWFQob3V0LmluYzMsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmM0PC1pTkVYVChzaXRlLmxpc3QuZnJlcS40LCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KRDwtZ2dpTkVYVChvdXQuaW5jNCwgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCg0Kb3V0LmluYzU8LWlORVhUKHNpdGUubGlzdC5mcmVxLjUsIHE9MCwgZGF0YXR5cGU9ImluY2lkZW5jZV9mcmVxIiwgc2l6ZT1OVUxMLCBuYm9vdD0xMDApDQpFPC1nZ2lORVhUKG91dC5pbmM1LCB0eXBlPTEsIGNvbG9yLnZhcj0ic2l0ZSIpICsgDQogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArDQogIHlsYWIoIlNwZWNpZXMgUmljaG5lc3MiKSArDQogIHhsYWIoIk51bWJlciBvZiBRdWFkcmF0cyIpICsNCiAgbGFicyhjYXB0aW9uPSJCPTEwMC4iKQ0KDQpvdXQuaW5jNjwtaU5FWFQoc2l0ZS5saXN0LmZyZXEuNiwgcT0wLCBkYXRhdHlwZT0iaW5jaWRlbmNlX2ZyZXEiLCBzaXplPU5VTEwsIG5ib290PTEwMCkNCkY8LWdnaU5FWFQob3V0LmluYzYsIHR5cGU9MSwgY29sb3IudmFyPSJzaXRlIikgKyANCiAgdGhlbWVfYncoYmFzZV9zaXplID0gMTgpICsNCiAgeWxhYigiU3BlY2llcyBSaWNobmVzcyIpICsNCiAgeGxhYigiTnVtYmVyIG9mIFF1YWRyYXRzIikgKw0KICBsYWJzKGNhcHRpb249IkI9MTAwLiIpDQoNCm91dC5pbmM3PC1pTkVYVChzaXRlLmxpc3QuZnJlcS43LCBxPTAsIGRhdGF0eXBlPSJpbmNpZGVuY2VfZnJlcSIsIHNpemU9TlVMTCwgbmJvb3Q9MTAwKQ0KRzwtZ2dpTkVYVChvdXQuaW5jNywgdHlwZT0xLCBjb2xvci52YXI9InNpdGUiKSArIA0KICB0aGVtZV9idyhiYXNlX3NpemUgPSAxOCkgKw0KICB5bGFiKCJTcGVjaWVzIFJpY2huZXNzIikgKw0KICB4bGFiKCJOdW1iZXIgb2YgUXVhZHJhdHMiKSArDQogIGxhYnMoY2FwdGlvbj0iQj0xMDAuIikNCmBgYA0KDQpgYGB7ciBNYW55IGN1cnZlcyBvdXRwdXQsIGZpZy5oZWlnaHQ9MjUsIGZpZy53aWR0aD03LCBpbmNsdWRlPUZBTFNFfQ0KZ2dhcnJhbmdlKEEsIEIsIEMsIEQsIEUsIEYsIEcsIG5yb3c9NykNCmBgYA0KIA0KYGBge3IgRGF0YSByZWFycmFuZ2luZywgZWNobz1GQUxTRSwgZmlnLmhlaWdodD00LCBmaWcud2lkdGg9MTAsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9DQpJbnRlcnZhbHM8LXNlbGVjdChzbGljZShSaWNoR2F0aCwgYygyODo1NCkpLCBjKFJpY2hMQ0wsIFJpY2hVQ0wpKQ0KUmljaEludHM8LWNiaW5kKFJpY2hEaXZUYWIsIEludGVydmFscykNClJpY2hJbnRzJFBlcmNDb21wbGV0ZSA8LSBSaWNoSW50cyRSaWNobmVzc09icy9SaWNoSW50cyRSaWNobmVzc0V4cCoxMDANClJpY2hJbnRzJFBlcmNDb21wbGV0ZVU8LSBSaWNoSW50cyRSaWNobmVzc09icy9SaWNoSW50cyRSaWNoVUNMKjEwMA0KUmljaEludHMkUGVyY0NvbXBsZXRlTDwtIFJpY2hJbnRzJFJpY2huZXNzT2JzL1JpY2hJbnRzJFJpY2hMQ0wqMTAwDQpzaXRlc2l6ZXMkUXVhZHNBcmVhPC0gc2l0ZXNpemVzJFF1YWRyYXRzLyhwaSooc2l0ZXNpemVzJExlbmd0aF4yKSkNCnNpdGVzaXplcyRBcmVhPC0ocGkqKHNpdGVzaXplcyRMZW5ndGheMikpDQojIA0KIyBUSElTIFBMT1QgSVMgVFJBU0gNCiMgZ2dwbG90KFJpY2hJbnRzLCBhZXMoeD1TaXRlLCB5PVBlcmNDb21wbGV0ZSkpICsNCiMgICBnZW9tX2JhcihhZXMoeT1zaXRlc2l6ZXMkUXVhZHJhdHMseD1TaXRlKSwgc3RhdD0iaWRlbnRpdHkiLCB3aWR0aCA9IDAuNzUsIGZpbGw9ImxpZ2h0Z3JleSIpKw0KIyAgIGdlb21fcG9pbnQoc2l6ZT0yKSsNCiMgICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVBlcmNDb21wbGV0ZUwsIHltYXg9UGVyY0NvbXBsZXRlVSksIHdpZHRoPS4zKSArDQojICAgeWxhYigiT2JzZXJ2ZWQvRXhwZWN0ZWQgUmljaG5lc3MgKiAxMDAiKSsNCiMgICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+LiwgbmFtZSA9ICJRdWFkcmF0cyBTYW1wbGVkIikpKw0KIyAgIGdndGl0bGUoIkNvbXBsZXRpb24gcGVyY2VudGFnZSBhbmQgc2FtcGxlIHNpemUgcGVyIHNpdGUiKSsNCiMgICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpgYGB7ciBMTSBTYW1wbGluZyBzdWZmaWNpZW5jeSwgaW5jbHVkZT1GQUxTRX0NCmxtUmljaFF1YWQgPC0gbG0oUmljaEludHMkUGVyY0NvbXBsZXRlIH4gc2l0ZXNpemVzJFF1YWRzQXJlYSkNCmF1dG9wbG90KGxtUmljaFF1YWQpDQphUmljaFF1YWQ8LWFub3ZhKGxtUmljaFF1YWQpDQphUmljaFF1YWQNCmBgYA0KDQpUaGVzZSBjdXJ2ZXMgaWxsdXN0cmF0ZSBub3Qgb25seSAqd2hlcmUqIHRoZSBmbGF0dGVuaW5nIHBvaW50IChleHBlY3RlZCByaWNobmVzcykgb2NjdXJzLCBidXQgYWxzbyAqaG93IHF1aWNrbHkqLiBFeGFtaW5pbmcgYSBjdXJ2ZSBjYW4gYWxsb3cgc29tZW9uZSB0byBlc3RpbWF0ZSBob3cgbWFueSBtb3JlIHNhbXBsZXMgd291bGQgYmUgbmVlZGVkIHRvIHJlYWNoIHRoYXQgcG9pbnQsIGhvd2V2ZXIgaWYgZG9pbmcgc28gc2FtcGxlcyBhIGxhcmdlciBhcmVhIHRoZW4gdGhlIGN1cnZlIG1heSBuZXZlciBmbGF0dGVuLiANCg0KTGV0J3Mgc2VlIGlmIHNhbXBsaW5nIGVmZm9ydCAoIyBxdWFkcmF0cy9hcmVhIHNhbXBsZWQpIGFmZmVjdGVkIHBlcmNlbnQgZXN0aW1hdGVkIHNhbXBsaW5nIGNvbXBsZXRpb247IGlmIGl0IGRpZCwgdGhhdCB3b3VsZCBiZSBhIGJpZyBwcm9ibGVtIGFuZCBJIHdvdWxkIGhhdmUgYSBsb3Qgb2YgZXhwbGFpbmluZyB0byBkbyB0byBteSBjb21taXR0ZWUuDQoNCmBgYHtyIFNhbXBsaW5nIHN1ZmZpY2llbmN5LCBlY2hvPUZBTFNFfQ0KZ2dwbG90KFJpY2hJbnRzLCBhZXMoeD1zaXRlc2l6ZXMkUXVhZHNBcmVhLCB5PVBlcmNDb21wbGV0ZSwgY29sb3I9ImJsYWNrIikpICsNCiAgZ2VvbV9zbW9vdGgobWV0aG9kPSJsbSIsIGNvbG9yPSJibGFjayIpKw0KICBnZW9tX3RleHQobGFiZWw9UmljaEludHMkU2l0ZSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0zKSsNCiAgeWxhYigiRXN0aW1hdGVkICUgU3BlY2llcyBTYW1wbGVkIikrDQogIHhsYWIoZXhwcmVzc2lvbihRdWFkcmF0c35TYW1wbGVkL1NpdGV+QXJlYX4obV4yKSkpKw0KICBnZ3RpdGxlKCJFc3RpbWF0ZWQgc2FtcGxpbmcgY29tcGxldGlvbiBkb2VzIG5vdCBpbmNyZWFzZSB3aXRoIHNhbXBsaW5nIGVmZm9ydCIpKw0KICBjb29yZF9jYXJ0ZXNpYW4oeWxpbSA9IGMoMCwgMTAwKSkrDQogIHRoZW1lKGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTQpLCBwbG90LnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemU9MTQpKQ0KYGBgDQoNClRoZXJlIGlzIG5vIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHNhbXBsaW5nIGVmZm9ydCBhbmQgY29tcGxldGlvbiBwZXJjZW50YWdlIChwPWByIGFSaWNoUXVhZFsxLDVdYCkuIEhvd2V2ZXIsIG5vdGUgdGhhdCBTaXRlcyAxMCBhbmQgMjYgd2VyZSBmbGFnZ2VkIGFzIG91dGxpZXJzIGJ5IHRoZSBhdXRvcGxvdCBmdW5jdGlvbi4gVGhpcyBpbmFkZXF1YXRlIHNhbXBsaW5nIGlzIGxpa2VseSB0aGUgcmVzdWx0IG9mIHRvbyBmZXcgcXVhZHJhdHMgc2FtcGxlZCBhdCB0aGUgd2V0bGFuZCBlZGdlIHJlbGF0aXZlIHRvIHRoZSBzaXplIG9mIHRoZSB3ZXRsYW5kLiANCg0KDQoNCiMjIEVmZmVjdHMgb24gRGl2ZXJzaXR5DQoNCjxmaWd1cmU+DQo8aW1nIHNyYz0iSW1hZ2VzL0dvb3NlY3JvcHBlZC5qcGciPjwvZmlndXJlPjxicj4NCg0KYGBge3IgU2l0ZSBzaXplIGFuZCByaWNobmVzcywgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0NCnF1YWRkaWVzPC1tZXJnZShzaXRlc2l6ZXMsIFJpY2hJbnRzLCBieT0iU2l0ZSIpDQpxdWFkZGllcyRMYXRpdHVkZSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihxdWFkZGllcyRMYXRpdHVkZSkpDQoNCmdncGxvdChSaWNoSW50cywgYWVzKHg9c2l0ZXNpemVzJEFyZWEsIHk9UmljaEludHMkUmljaG5lc3NPYnMpKSArDQogIGdlb21fcG9pbnQoc2l6ZT0zKSsNCiAgeWxhYigiU2l0ZSBSaWNobmVzcyIpKw0KICB4bGFiKGV4cHJlc3Npb24obG9nflNpdGV+QXJlYX4obV4yKSkpKw0KICBzY2FsZV94X2xvZzEwKCkrDQogIGdndGl0bGUoIlJpY2huZXNzIGRlY3JlYXNlcyB3aXRoIHNpdGUgYXJlYSIpKw0KICB0aGVtZShheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTE0KSwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplPTE0KSkNCmBgYA0KDQpUaGVyZSBhcHBlYXJzIHRvIGJlIGEgcmVsYXRpb25zaGlwIGJldHdlZW4gc2l0ZSByaWNobmVzcyBhbmQgc2l0ZSBhcmVhLCBidXQgdW5leHBlY3RlZGx5IHRoaXMgcmVsYXRpb25zaGlwIGFwcGVhcnMgdG8gYmUgbmVnYXRpdmUuIEJlY2F1c2UgdGhlIGRhdGEgYXJlIGxpa2VseSBub24tbGluZWFyLCBhIGdlbmVyYWxpemVkIGxpbmVhciBtb2RlbCBzaG91bGQgYmUgdXNlZCB0byBhc3Nlc3MgdGhpcyByZWxhdGlvbnNoaXAuDQoNCiMjIENvbW11bml0eSBDbGFzc2lmaWNhdGlvbg0KDQpTaW1pbGFyaXR5IG1hdHJpeA0KDQpPcmRpbmF0aW9ucw0KDQojIyANCg==